
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>系统防护实战应对百万QPS攻击 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>系统防护实战应对百万QPS攻击 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中提到了哪几种主要的高并发攻击类型？它们的攻击目标有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要包括DDoS攻击、CC攻击和爬虫攻击。DDoS攻击通过大量请求耗尽系统资源；CC攻击则针对应用层，反复请求特定接口；而爬虫攻击的目的通常是数据爬取。</div>
          </div>
          <div class="card-source">来源: 一、理解高并发攻击的本质 -> 1. 常见高并发攻击类型分析</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在前端防护中，为请求参数添加签名和时间戳的主要目的是什么？其基本流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要目的是有效防止请求伪造。基本流程是：1. 将参数按字母顺序排序并拼接成字符串；2. 在字符串后附加时间戳和密钥；3. 使用MD5等算法生成签名；4. 将生成的签名和时间戳一同随请求发送给后端进行校验。</div>
          </div>
          <div class="card-source">来源: 二、前端防护策略 -> 3. 前端加密与签名校验</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Nginx中实现基于IP的限流时，`limit_req_zone`指令中的`rate`参数和`limit_req`指令中的`burst`参数分别起什么作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`rate`参数用于设置请求的平均速率限制（例如 `rate=10r/s` 表示每秒10个请求）。`burst`参数定义了允许超出速率限制的突发请求数，这些请求会被放入一个队列中处理，起到了缓冲作用。</div>
          </div>
          <div class="card-source">来源: 三、网关层防护措施 -> 1. 基于IP的限流策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">令牌桶（Token Bucket）限流算法的核心工作机制是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">令牌桶算法的核心机制是：系统以一个恒定的速率（refillRate）向桶中放入令牌，桶的容量（capacity）是固定的。当有请求需要处理时，必须先从桶中获取相应数量的令牌。如果桶中令牌足够，则请求被允许；如果令牌不足，请求则被拒绝或等待。这允许系统处理短时间内的突发流量。</div>
          </div>
          <div class="card-source">来源: 四、应用层防护技术 -> 1. 接口限流算法实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">请描述文档中提到的多级缓存架构的典型查询流程。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">典型的查询流程是：1. 首先查询本地缓存（如Caffeine），如果命中则直接返回。2. 如果本地缓存未命中，则查询分布式缓存（如Redis）。3. 如果分布式缓存命中，则将数据回填到本地缓存中并返回。4. 如果分布式缓存也未命中，则查询数据库。5. 从数据库查询到数据后，再将数据分别回填到分布式缓存和本地缓存中，最后返回给调用方。</div>
          </div>
          <div class="card-source">来源: 五、缓存与队列的合理应用 -> 1. 多级缓存架构设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在高并发场景下，引入消息队列（MQ）能起到什么关键作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">关键作用是“削峰填谷”和实现业务异步处理。当瞬时请求量激增时，系统可以将请求先快速写入消息队列，然后由后端的消费者服务按照自己的处理能力平稳地进行消费，避免了流量洪峰直接冲击后端脆弱的服务（如数据库），从而保证了系统的稳定性和可用性。</div>
          </div>
          <div class="card-source">来源: 五、缓存与队列的合理应用 -> 2. 异步处理与消息队列</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中是如何通过AOP技术实现数据库读写分离的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过AOP切面（Aspect）来实现。首先，定义两个切点（Pointcut），分别匹配读操作（如以`select`开头的方法）和写操作（如以`insert`开头的方法）。然后，通过`@Before`通知，在目标方法执行前，根据匹配到的切点类型，动态地在线程上下文中设置当前应使用的数据源类型（主库`MASTER`或从库`SLAVE`），从而将SQL请求路由到正确的数据库实例。</div>
          </div>
          <div class="card-source">来源: 六、数据库层防护策略 -> 1. 读写分离与分库分表</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在使用Sentinel进行服务容错时，`@SentinelResource`注解的`fallback`和`blockHandler`属性分别在什么场景下被触发？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`fallback`属性用于处理因程序运行时异常或服务熔断降级而导致的调用失败场景。而`blockHandler`属性则专门用于处理因Sentinel的流控规则（如QPS限制）被触发，导致请求被阻塞（BlockException）的场景。</div>
          </div>
          <div class="card-source">来源: 七、应急响应与监控预警 -> 2. 自动化降级与熔断策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中介绍的热点数据识别机制是如何工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该机制通过一个具有较短过期时间的本地缓存（如Caffeine）作为计数器，来统计每个key在单位时间内的访问次数。一个定时任务会周期性地扫描这个计数器缓存，找出访问次数超过预设阈值的key，并将它们识别为“热点key”。识别出的热点key可以被特殊处理，例如预加载到本地缓存中。</div>
          </div>
          <div class="card-source">来源: 五、缓存与队列的合理应用 -> 3. 热点数据识别与特殊处理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
